// 在这里封装一个订阅发布模式，用于给逻辑解耦

// 主要原理： 使用一个数组把一堆函数存起来，然后在我们希望调用的时候，调用
// 存的时候，使用一个特定的 字符串作为键 ， 数组就是值
interface KeyMap {
    [index: string]: Function[]
}

interface IEventBus {
    events: KeyMap;
    on: (key: string, callback: Function) => void;
    emit: (key: string, data: any) => void;
}

const EventBus: IEventBus = {
    // 订阅方法
    // on(key:string,callback:Function) { 
    //     if(!obj[key]){
    //         obj[key] = []
    //     }
    //     obj[key].push(callback)
    // },
    // // 发布方法
    // emit(key:string) { 
    //     if(obj[key]){
    //         obj[key].forEach(fn=>fn())
    //     }
    // },
    // 取消订阅的
    // off(){}



    events: {},
    // 上面是主要思路，下面是 ts 的实现代码
    on(key: string, callback: Function) {
        if (!this.events[key]) {
            this.events[key] = []
        }
        this.events[key].push(callback)
    },
    // 发布方法
    emit(key: string, data: any) {
        if (this.events[key]) {
            this.events[key].forEach(fn => fn(data))
        }
    },
}

export default EventBus;

